import store from '@/store'
import axios from 'axios'
// 单独引入element-ui中的Message消息弹窗
import { Message } from 'element-ui'

import router from '@/router'
// 时间戳
import { getTimeStamp } from '@/utils/auth'
const TimeOutDuration = 2000

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  // 如果请求本身没有带上token但是vuex里面存在，就应该统一注入token
  config => {
    if (!config.headers.Authorization && store.getters.token) {
      // 判断token是否过期,未过期需要注入
      if (!isTimeOut()) {
        // JWT鉴权标准的Bearer Token规范   格式是：'Bearer xxxx'
        config.headers.Authorization = `Bearer ${store.getters.token}`
      } else {
        store.dispatch('user/logout')
        router.push('/login')
        return Promise.reject(new Error('登录已经过期'))
      }
    }
    return config
  },
  err => {
    // 处理可能出现的报错
    Message.error(err.message)
    return Promise.reject(new Error(err.message))
  }
)

// response interceptor
service.interceptors.response.use(
  // 响应拦截器可以接收两个函数作为回调函数
  res => {
    // 解构所有数据
    const { success, message, data } = res.data
    // 网络层面的成功
    if (success) {
      // 数据层面成功  返回数据
      return data
    } else {
      // 数据层面失败  弹窗提示,然后停止请求
      Message.error(message)
      // 返回一个拒绝的Promise,走catch流程
      return Promise.reject(new Error(message))
    }
  },
  err => {
    console.log('拦截器网络层面失败逻辑：断网、url错误、token失效(10002)')
    // 被动token失效处理
    if (err.response && err.response.data && err.response.data.code === 10002) {
      store.dispatch('user/logout')
      router.push('/login')
    } else {
      // 其他网络层面失败
      console.dir(err)
      Message.error(err.message)
    }

    return Promise.reject(new Error(err.message))
  }
)

function isTimeOut() {
  const currentTime = Date.now()
  const timeStamp = getTimeStamp()
  return (currentTime - timeStamp) / 1000 > TimeOutDuration
}

export default service
